home *** CD-ROM | disk | FTP | other *** search
/ Collection of Internet / Collection of Internet.iso / msdos / lynx / source / www / library / implemen / htwriter.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-25  |  3.9 KB  |  184 lines

  1. /*        FILE WRITER            HTWrite.c
  2. **        ===========
  3. **
  4. */
  5. #include "HTWriter.h"
  6.  
  7. #define BUFFER_SIZE 4096    /* Tradeoff */
  8.  
  9. #include "HTUtils.h"
  10. #include "tcp.h"
  11. #include <stdio.h>
  12.  
  13.  
  14. /*        HTML Object
  15. **        -----------
  16. */
  17.  
  18. struct _HTStream {
  19.     CONST HTStreamClass *    isa;
  20.  
  21.     int    soc;
  22.     char    *write_pointer;
  23.     char     buffer[BUFFER_SIZE];
  24. #ifdef NOT_ASCII
  25.     BOOL    make_ascii;    /* Are we writing to the net? */
  26. #endif
  27. };
  28.  
  29.  
  30. /*    Write the buffer out to the socket
  31. **    ----------------------------------
  32. */
  33.  
  34. PRIVATE void flush ARGS1(HTStream *, me)
  35. {
  36.     char *read_pointer     = me->buffer;
  37.     char *write_pointer = me->write_pointer;
  38.  
  39. #ifdef NOT_ASCCII
  40.     if (me->make_ascii) {
  41.         char * p;
  42.     for(p = me->buffer; p < me->write_pointer; p++)
  43.         *p = TOASCII(*p);
  44.     }
  45. #endif
  46.     while (read_pointer < write_pointer) {
  47.         int status;
  48.     status = NETWRITE(me->soc, me->buffer,  /* Put timeout? @@@ */
  49.             write_pointer - read_pointer);
  50.     if (status<0) {
  51.         if(TRACE) fprintf(stderr,
  52.         "HTWrite: Error: write() on socket returns %d !!!\n", status);
  53.         return;
  54.     }
  55.     read_pointer = read_pointer + status;
  56.     }
  57.     me->write_pointer = me->buffer;
  58. }
  59.  
  60.  
  61. /*_________________________________________________________________________
  62. **
  63. **            A C T I O N     R O U T I N E S
  64. */
  65.  
  66. /*    Character handling
  67. **    ------------------
  68. */
  69.  
  70. PRIVATE void HTWriter_put_character ARGS2(HTStream *, me, char, c)
  71. {
  72.     if (me->write_pointer == &me->buffer[BUFFER_SIZE]) flush(me);
  73.     *me->write_pointer++ = c;
  74. }
  75.  
  76.  
  77.  
  78. /*    String handling
  79. **    ---------------
  80. **
  81. **    Strings must be smaller than this buffer size.
  82. */
  83. PRIVATE void HTWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
  84. {
  85.     int l = strlen(s);
  86.     if (me->write_pointer + l > &me->buffer[BUFFER_SIZE]) flush(me);
  87.     strcpy(me->write_pointer, s);
  88.     me->write_pointer = me->write_pointer + l;
  89. }
  90.  
  91.  
  92. /*    Buffer write.  Buffers can (and should!) be big.
  93. **    ------------
  94. */
  95. PRIVATE void HTWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
  96. {
  97.  
  98.     CONST char *read_pointer     = s;
  99.     CONST char *write_pointer = s+l;
  100.  
  101.     flush(me);        /* First get rid of our buffer */
  102.  
  103.     while (read_pointer < write_pointer) {
  104.         int status = NETWRITE(me->soc, read_pointer,
  105.             write_pointer - read_pointer);
  106.     if (status<0) {
  107.         if(TRACE) fprintf(stderr,
  108.         "HTWriter_write: Error on socket output stream!!!\n");
  109.         return;
  110.     }
  111.     read_pointer = read_pointer + status;
  112.     }
  113. }
  114.  
  115.  
  116.  
  117.  
  118. /*    Free an HTML object
  119. **    -------------------
  120. **
  121. **    Note that the SGML parsing context is freed, but the created object is not,
  122. **    as it takes on an existence of its own unless explicitly freed.
  123. */
  124. PRIVATE void HTWriter_free ARGS1(HTStream *, me)
  125. {
  126.     flush(me);
  127.     NETCLOSE(me->soc);
  128.     free(me);
  129. }
  130.  
  131. PRIVATE void HTWriter_abort ARGS2(HTStream *, me, HTError, e)
  132. {
  133.     HTWriter_free(me);
  134. }
  135.  
  136.  
  137. /*    Structured Object Class
  138. **    -----------------------
  139. */
  140. PRIVATE CONST HTStreamClass HTWriter = /* As opposed to print etc */
  141. {        
  142.     "SocketWriter",
  143.     HTWriter_free,
  144.     HTWriter_abort,
  145.     HTWriter_put_character, HTWriter_put_string,
  146.     HTWriter_write
  147. }; 
  148.  
  149.  
  150. /*    Subclass-specific Methods
  151. **    -------------------------
  152. */
  153.  
  154. PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
  155. {
  156.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  157.     if (me == NULL) outofmem(__FILE__, "HTML_new");
  158.     me->isa = &HTWriter;       
  159.     
  160. #ifdef NOT_ASCII
  161.     me->make_ascii = NO;
  162. #endif    
  163.     me->soc = soc;
  164.     me->write_pointer = me->buffer;
  165.     return me;
  166. }
  167.  
  168. /*    Subclass-specific Methods
  169. **    -------------------------
  170. */
  171.  
  172. PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
  173. {
  174.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  175.     if (me == NULL) outofmem(__FILE__, "HTML_new");
  176.     me->isa = &HTWriter;       
  177.  
  178. #ifdef NOT_ASCII
  179.     me->make_ascii = YES;
  180. #endif    
  181.     me->soc = soc;
  182.     me->write_pointer = me->buffer;
  183.     return me;
  184. }